home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 10 / amigaformatcd10.iso / -screenplay- / shareware / mris 1.1 / .mris1_1src.lha / ConfigKeys.c < prev    next >
C/C++ Source or Header  |  1996-10-07  |  9KB  |  296 lines

  1. #define MYLIB_BOOPSI
  2.  
  3. #ifndef INTUITION_GADGETCLASS_H
  4. #include <intuition/gadgetclass.h>
  5. #endif
  6.  
  7. #ifndef INTUITION_IMAGECLASS_H
  8. #include <intuition/imageclass.h>
  9. #endif
  10.  
  11. #include <proto/layers.h>
  12.  
  13. #include "xmris.h"
  14. #include "ConfigKeys.h"
  15. #include "BOOPSILib.h"
  16.  
  17. #include "Catalog.h"
  18.  
  19. /************************************************************************/
  20.  
  21. struct Window *ConfigKeysWindow;
  22.  
  23. /************************************************************************/
  24.  
  25. static Object *Contents;
  26. static Object *StringGroup, *UseButton;
  27.  
  28. static struct TagItem WindowTags[]=
  29. {
  30.   {WA_Left, ~0},
  31.   {WA_Top, ~0},
  32.   {WA_Height, 0},
  33.   {WA_Width, 0},
  34.   {WA_CustomScreen, (ULONG)NULL},
  35.   {WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_GADGETUP | IDCMP_ACTIVEWINDOW | IDCMP_NEWSIZE},
  36.   {WA_MaxWidth, 0},
  37.   {WA_MaxHeight, 0},
  38.   {WA_MinWidth, 0},
  39.   {WA_MinHeight, 0},
  40.   {WA_Gadgets, NULL},
  41.   {WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_SIMPLE_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP | WFLG_NEWLOOKMENUS | WFLG_NOCAREREFRESH},
  42.   {TAG_DONE}
  43. };
  44.  
  45. /************************************************************************/
  46.  
  47. void CloseConfigKeysWindow(void)
  48.  
  49. {
  50.   if (ConfigKeysWindow!=NULL)
  51.     {
  52.       LockLayerInfo(ConfigKeysWindow->WLayer->LayerInfo);
  53.       WindowTags[0].ti_Data=ConfigKeysWindow->LeftEdge;
  54.       WindowTags[1].ti_Data=ConfigKeysWindow->TopEdge;
  55.       WindowTags[2].ti_Data=ConfigKeysWindow->Height;
  56.       WindowTags[3].ti_Data=ConfigKeysWindow->Width;
  57.       UnlockLayerInfo(ConfigKeysWindow->WLayer->LayerInfo);
  58.       CloseWindowSafely(ConfigKeysWindow);
  59.       ConfigKeysWindow=NULL;
  60.     }
  61.   DisposeObject(Contents);
  62.   Contents=NULL;
  63.   FreeBOOPSIClasses();
  64. }
  65.  
  66. /************************************************************************/
  67.  
  68. void OpenConfigKeysWindow(void)
  69.  
  70. {
  71.   if (ConfigKeysWindow==NULL)
  72.     {
  73.       if (CreateBOOPSIClasses())
  74.     {
  75.       Object *LabelGroup, *DefaultGroup;
  76.       Object *TheObject;
  77.       char *UseLabel, *CancelLabel;
  78.       int Key;
  79.  
  80.       UseLabel=GetString(MSG_USE_BUTTON);
  81.       CancelLabel=GetString(MSG_CANCEL_BUTTON);
  82.       Contents=TheObject=BOOPSILibO(Root),
  83.                  BOOPSILibA_Group_Spacing, (1<<16)|1,
  84.                  BOOPSILibA_Group_Child, BOOPSILibO(Group),
  85.                    BOOPSILibA_Group_Horizontal, TRUE,
  86.                    BOOPSILibA_Group_Child, LabelGroup=BOOPSILibO(Group),
  87.                      BOOPSILibA_Group_Spacing, (1<<16)|2,
  88.                  BOOPSILibA_Group_Justify, BOOPSILibV_Group_Justify_Left,
  89.                  BOOPSILibO_End,  /* Group */
  90.                    BOOPSILibA_Group_Child, StringGroup=BOOPSILibO(Group),
  91.                      BOOPSILibA_Group_Spacing, (1<<16)|2,
  92.                  BOOPSILibO_End,  /* Group */
  93.                    BOOPSILibA_Group_Child, DefaultGroup=BOOPSILibO(Group),
  94.                      BOOPSILibA_Group_Spacing, (1<<16)|2,
  95.                  BOOPSILibA_Group_Justify, BOOPSILibV_Group_Justify_Left,
  96.                  BOOPSILibO_End,  /* Group */
  97.                BOOPSILibO_End,  /* Group */
  98.  
  99.                  BOOPSILibA_Group_Child, BOOPSILibO(Group),
  100.                    BOOPSILibA_Group_Horizontal, TRUE,
  101.                    BOOPSILibA_Group_SameSize, TRUE,
  102.  
  103.                    BOOPSILibA_Group_Child, BOOPSILibO(Frame),
  104.                      IA_FrameType, FRAME_BUTTON,
  105.                  BOOPSILibA_Frame_Space, (40<<8),
  106.                      BOOPSILibA_Frame_Gadget, UseButton=BOOPSILibO(Button),
  107.                        GA_Text, UseLabel+1,
  108.                    BOOPSILibA_ControlChar, *UseLabel,
  109.                        GA_ID, MSG_USE_BUTTON,
  110.                        BOOPSILibO_End,  /* Button */
  111.                      BOOPSILibO_End,  /* Frame */
  112.  
  113.                    BOOPSILibA_Group_Child, BOOPSILibO(Frame),
  114.                      IA_FrameType, FRAME_BUTTON,
  115.                  BOOPSILibA_Frame_Space, (40<<8),
  116.                      BOOPSILibA_Frame_Gadget, BOOPSILibO(Button),
  117.                        GA_Text, CancelLabel+1,
  118.                    BOOPSILibA_ControlChar, *CancelLabel,
  119.                        GA_ID, MSG_CANCEL_BUTTON,
  120.                        BOOPSILibO_End,  /* Button */
  121.                      BOOPSILibO_End,  /* Frame */
  122.  
  123.                BOOPSILibO_End,  /* Group */
  124.  
  125.              BOOPSILibO_End;  /* Root */
  126.  
  127.       for (Key=0; TheObject!=NULL && Key<KEYS; Key++)
  128.         {
  129.             TheObject=BOOPSILibO(Frame),
  130.                     IA_FrameType, FRAME_RIDGE,
  131.                     BOOPSILibA_Frame_Fake, TRUE,
  132.                     BOOPSILibA_Frame_Gadget, BOOPSILibO(Label),
  133.                     GA_Text, GetString(MSG_DEMO_UP+Key),
  134.                   BOOPSILibO_End,  /* Label */
  135.                     BOOPSILibO_End;  /* Frame */
  136.             if (TheObject!=NULL)
  137.               {
  138.             Object *String;
  139.  
  140.                 DoMethod(LabelGroup,OM_ADDMEMBER,TheObject);
  141.                 TheObject=BOOPSILibO(Frame),
  142.                     IA_FrameType, FRAME_RIDGE,
  143.                     BOOPSILibA_Frame_Gadget, String=BOOPSILibO(String),
  144.                       GA_ID, MSG_DEMO_UP,
  145.                       GA_UserData, Key,
  146.                       STRINGA_MaxChars, 100,
  147.                       BOOPSILibO_End,  /* String */
  148.                     BOOPSILibO_End;  /* Frame */
  149.                 if (TheObject!=NULL)
  150.               {
  151.             if (data.keysyms[Key].Description!=GetString(MSG_KEY_UP+Key))
  152.               {
  153.                 SetAttrs(String,STRINGA_TextVal,data.keysyms[Key].Description,TAG_DONE);
  154.               }
  155.             DoMethod(StringGroup,OM_ADDMEMBER,TheObject);
  156.             TheObject=BOOPSILibO(Frame),
  157.                               IA_FrameType, FRAME_RIDGE,
  158.                               BOOPSILibA_Frame_Fake, TRUE,
  159.                               BOOPSILibA_Frame_Gadget, BOOPSILibO(Label),
  160.                             GA_Text, GetString(MSG_KEY_UP+Key),
  161.                             BOOPSILibO_End,  /* Label */
  162.                               BOOPSILibO_End;  /* Frame */
  163.             if (TheObject!=NULL)
  164.               {
  165.                 DoMethod(DefaultGroup,OM_ADDMEMBER,TheObject);
  166.               }
  167.               }
  168.               }
  169.           }
  170.  
  171.       WindowTags[4].ti_Data=(ULONG)display.Screen->Screen;
  172.       WindowTags[5].ti_Tag=WA_IDCMP;
  173.       if (DoMethod(Contents,BOOPSILibM_Root_Init,WindowTags,50)==0)
  174.         {
  175.           WindowTags[5].ti_Tag=TAG_IGNORE;
  176.           ConfigKeysWindow=OpenWindowTags(NULL,
  177.                           WA_ScreenTitle, display.window->ScreenTitle,
  178.                           WA_Title, GetString(MSG_CONFIGKEYS_TITLE),
  179.                           TAG_MORE, WindowTags);
  180.           if (ConfigKeysWindow!=NULL)
  181.         {
  182.           ConfigKeysWindow->UserPort=&WindowPort;
  183.           if (ModifyIDCMP(ConfigKeysWindow,WindowTags[5].ti_Data))
  184.             {
  185.               return;
  186.             }
  187.         }
  188.         }
  189.     }
  190.       CloseConfigKeysWindow();
  191.     }
  192.   else
  193.     {
  194.       ShowWindow(ConfigKeysWindow);
  195.     }
  196. }
  197.  
  198. /************************************************************************/
  199.  
  200. static INLINE int UseKeys(void)
  201.  
  202. {
  203.   struct Requester Requester;
  204.   APTR State;
  205.   Object *NewKey;
  206.   int Result;
  207.  
  208.   Result=TRUE;
  209.   InitRequester(&Requester);
  210.   Requester.Flags|=NOREQBACKFILL | SIMPLEREQ;
  211.   Request(&Requester,ConfigKeysWindow);
  212.   State=((struct MinList *)AttrGet(StringGroup,BOOPSILibA_Group_Children))->mlh_Head;
  213.   while (Result && (NewKey=NextObject(&State))!=NULL)
  214.     {
  215.       char *KeyDesc;
  216.       char *t;
  217.  
  218.       NewKey=(Object *)AttrGet(NewKey,BOOPSILibA_Frame_Gadget);
  219.       KeyDesc=(char *)AttrGet(NewKey,STRINGA_TextVal);
  220.       for (t=KeyDesc; *t!='\0' && *t==' '; t++)
  221.     ;
  222.       if (*t=='\0')
  223.     {
  224.       KeyDesc=NULL;
  225.     }
  226.       if (!ChangeKey((int)((struct ExtGadget *)NewKey)->UserData,KeyDesc))
  227.     {
  228.       Result=FALSE;
  229.     }
  230.     }
  231.   if (ConfigKeysWindow->FirstRequest!=NULL)
  232.     {
  233.       EndRequest(&Requester,ConfigKeysWindow);
  234.     }
  235.   if (!Result)
  236.     {
  237.       ActivateGadget((struct Gadget *)NewKey,ConfigKeysWindow,NULL);
  238.     }
  239.   return Result;
  240. }
  241.  
  242. /************************************************************************/
  243.  
  244. void ProcessConfigKeysWindow(struct IntuiMessage *Message)
  245.  
  246. {
  247.   if ((Message=(struct IntuiMessage *)DoMethod(Contents,BOOPSILibM_Root_ProcessMessage,Message))!=NULL)
  248.     {
  249.       switch (Message->Class)
  250.     {
  251.     case IDCMP_GADGETUP:
  252.       switch (((struct ExtGadget *)Message->IAddress)->GadgetID)
  253.         {
  254.         case MSG_DEMO_UP:
  255.           {
  256.         APTR Strings;
  257.         Object *Next;
  258.  
  259.         Strings=((struct MinList *)AttrGet(StringGroup,BOOPSILibA_Group_Children))->mlh_Head;
  260.         while ((APTR)AttrGet(NextObject(&Strings),BOOPSILibA_Frame_Gadget)!=Message->IAddress)
  261.           ;
  262.         if ((Next=NextObject(&Strings))==NULL)
  263.           {
  264.             Next=UseButton;
  265.           }
  266.         else
  267.           {
  268.             Next=(Object *)AttrGet(Next,BOOPSILibA_Frame_Gadget);
  269.           }
  270.         ActivateGadget((struct Gadget *)Next,ConfigKeysWindow,NULL);
  271.           }
  272.           break;
  273.  
  274.         case MSG_USE_BUTTON:
  275.           if (!UseKeys())
  276.         {
  277.           break;
  278.         }
  279.           /* fall through */
  280.  
  281.         case MSG_CANCEL_BUTTON:
  282.           DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
  283.           CloseConfigKeysWindow();
  284.           return;
  285.         }
  286.       break;
  287.  
  288.     case IDCMP_CLOSEWINDOW:
  289.       DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
  290.       CloseConfigKeysWindow();
  291.       return;
  292.     }
  293.       DoMethod(Contents,BOOPSILibM_Root_ReplyMessage,Message);
  294.     }
  295. }
  296.